from django_redis import get_redis_connection
from redis import RedisError
from rest_framework import serializers

from utils.exceptions import logger

"""
Model 必须要有model 才能自动生成字段


"""
class RegisterSmscodeSerializer(serializers.Serializer):
    #用户输入的验证码
    text = serializers.CharField(label='用户输入的验证码', max_length=4, min_length=4, required=True)
    image_code_id = serializers.UUIDField(label='验证码唯一性id',required=True)

    # 校验参数
    """
    序列化器校验
    1.字段类型
    2.字段选项
    3.单个字段
    4.多个字段

    """
    def validate(self, attrs):
        #1.获取用户提交的验证码
        text = attrs.get("text")
        #2.获取redis的雁阵吗
        redis_conn = get_redis_connection("code")
        # 获取数据
        image_code_id = attrs.get("image_code_id")
        redis_text = redis_conn.get('img_%s'%image_code_id)
        # redis 数据时效性
        if redis_text is None:
            raise serializers.ValidationError('验证码已过期')

            # 将redis中的验证码删除
        try:
            redis_conn.delete('img_%s'%image_code_id)
        except RedisError as e:
            logger.error(e)
        # 对redis的验证码编码之后进行比对,要注意大小写问题
        if redis_text.decode().lower() != text.lower():
            raise serializers.ValidationError('验证码错误')

        return attrs